const {
  NoPermissionErr,
  NotLoginErr,
  TokenExpireErr,
} = require('../../response/code')
const { verifyToken, redisCheck } = require('../../util/jwt')

const redis = require('../../util/redis')

const { TOKEN_PREFIX } = require('../../consts/system')
/**
 * 校验TOKEN
 * @param {*} ctx
 * @param {*} next
 * @returns
 */
const validateToken = async (ctx, next) => {
  // 取得header信息
  const header = ctx.request.header
  // 取得token信息
  const token = header['authorization']
    ? header['authorization'].split(' ')[1]
    : ''
  if (!token) {
    return ctx.app.emit('error', NotLoginErr, ctx)
  }
  const secret = process.env.JWT_SECRET
  const user = verifyToken(token, secret)
  if (!user) {
    // token 校验失败
    return ctx.app.emit('error', TokenExpireErr, ctx)
  }

  // redis 校验
  const conn = await redis.connect()
  const redisVal = await conn.get(`${TOKEN_PREFIX}:${user.phone}`) // user.phone 为 隐藏后的手机号
  conn.close()
  if (!redisCheck(token, redisVal)) {
    return ctx.app.emit('error', TokenExpireErr, ctx)
  }

  // 校验
  ctx.state.user = user
  //
  await next()
}

/**
 * 校验是否是管理员
 * @param {*} ctx
 * @param {*} next
 * @returns
 */
const validateAdmin = async (ctx, next) => {
  const user = ctx.state.user
  if (!user) {
    return ctx.app.emit('error', NotLoginErr, ctx)
  }
  console.log(user.role, '<<< role')
  //
  if (!user.role || user.role !== 'admin') {
    return ctx.app.emit('error', NoPermissionErr, ctx)
  }
  await next()
}

module.exports = {
  validateToken,
  validateAdmin,
}
